package com.jrx.anytxn.transaction.mapper.ext;

import com.jrx.anytxn.transaction.entity.AmAccountMainInfo;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 交易账户啊dao扩展
 *
 * @author haopu.zheng
 * date  2019/7/25
 **/
public interface ExtAmAccountMainInfoMapper {

    /**
     * 根据订单ID，账户类型,账户状态计算该类型已还金额之和
     *
     * @param loanId     订单id
     * @param type       账户类型
     * @param customerId 客户id
     * @param tenantId   租户id
     * @return java.math.BigDecimal
     * @author fan.yang
     * date: 2019/9/24 0024 下午 14:37
     */
    BigDecimal selectRePayAmountAmoByCondition(@Param("loanId") String loanId, @Param("type") String[] type,
                                               @Param("customerId") String customerId, @Param("tenantId") String tenantId);


    /**
     * 根据贷款ID、状态、类型、期数、客户号获取交易账户信息
     *
     * @param loanId        订单id
     * @param statusArrays  状态数组
     * @param accountType          类型
     * @param billingTenors 期数
     * @param customerId    客户id
     * @param tenantId      租户id
     * @return java.util.List<com.jrx.anytxn.transaction.entity.AmAccountMainInfo>
     * @author : zhenghaopu
     * date: 2019/9/25
     */
    List<AmAccountMainInfo> selectByStatusAndType(@Param(value = "loanId") String loanId,
                                                  @Param(value = "statusArrays") String[] statusArrays,
                                                  @Param(value = "accountType") String accountType,
                                                  @Param(value = "billingTenors") Integer[] billingTenors,
                                                  @Param(value = "customerId") String customerId,
                                                  @Param(value = "tenantId") String tenantId);
    /**
     * 信用就医替换 selectByStatusAndType
     * 根据贷款ID、状态、类型、期数、客户号获取交易账户信息
     *
     * @param loanId        订单id
     * @param statusArrays  状态数组
     * @param accountType          类型
     * @param billingTenors 期数
     * @param customerId    客户id
     * @param tenantId      租户id
     * @param productIds      产品id
     * @return java.util.List<com.jrx.anytxn.transaction.entity.AmAccountMainInfo>
     * @author : zhenghaopu
     * date: 2019/9/25
     */
    List<AmAccountMainInfo> selectByStatusProductsAndType(@Param(value = "loanId") String loanId,
                                                  @Param(value = "statusArrays") String[] statusArrays,
                                                  @Param(value = "accountTypes") String[] accountTypes,
                                                  @Param(value = "billingTenors") Integer[] billingTenors,
                                                  @Param(value = "customerId") String customerId,
                                                  @Param(value = "tenantId") String tenantId,
                                                  @Param("productIds") List<String> productIds);

    /**
     * 查询正常状态下的账户中某订单号在某期的某种账户类型的入账金额
     *
     * @param loanId     贷款id
     * @param tenor      期数
     * @param type       类型
     * @param customerId 客户id
     * @param tenantId   租户id
     * @return java.math.BigDecimal
     * @author fan.yang
     * date: 2019/9/24 0024 下午 14:38
     */
    BigDecimal selectPostingAmountByCondition(@Param("loanId") String loanId, @Param("tenor") Integer tenor,
                                              @Param("type") String type, @Param(value = "customerId") String customerId,
                                              @Param(value = "tenantId") String tenantId);

    /**
     * 根据条件获取账户数据
     *
     * @param cond 条件
     * @return 账户数据
     */
    List<AmAccountMainInfo> selectByCondSelectivePage(@Param("cond") AmAccountMainInfo cond,@Param("beginDate") String beginDate,@Param("endDate") String endDate);


    /**
     * 根据loanId、type、customerId、postingDate查询条数
     *
     * @param loanId      订单id
     * @param type        账户类型
     * @param customerId  客户id
     * @param postingDate 入账金额
     * @param tenantId    租户id
     */
    Integer selectCountByPostingDataAndLoanIdAndType(@Param("loanId") String loanId, @Param("type") String type,
                                                     @Param("customerId") String customerId,
                                                     @Param("postingDate") Date postingDate,
                                                     @Param("tenantId") String tenantId);

    /**
     * 根据订单号、类型、客户id、期数、状态 查询账户
     *
     * @param loanId       贷款id
     * @param type         账户类型
     * @param customerId   客户id
     * @param billingTenor 期数
     * @param statusList   状态列表
     */
    List<AmAccountMainInfo> selectByLoanIdAndTypeAndCustomerIdAndBillingTenorAndStatusIn(@Param("loanId") String loanId,
                                                                                         @Param("type") String type,
                                                                                         @Param("customerId") String customerId,
                                                                                         @Param(value = "billingTenor") Integer billingTenor,
                                                                                         @Param(value = "statusList") List<String> statusList,
                                                                                         @Param(value = "txnCode") String txnCode,
                                                                                         @Param(value = "tenantId") String tenantId);

    /**
     * 批量插入账户信息
     *
     * @param accountMainInfos 账户信息
     * @return int
     * @author zhenghaopu
     * date: 2019/9/9 11:22
     */
    int batchInsertAccount(List<AmAccountMainInfo> accountMainInfos);

    /**
     * 根据订单号、类型、客户id、租户id、状态 查询账户
     *
     * @param loanId
     * @param typeList
     * @param customerId
     * @param tenantId
     * @param statusList
     * @return
     */
    List<AmAccountMainInfo> selectAccounts(@Param("loanId") String loanId,
                                           @Param("typeList") List<String> typeList,
                                           @Param("customerId") String customerId,
                                           @Param("tenantId") String tenantId,
                                           @Param(value = "statusList") List<String> statusList);

    /**
     * 根据订单号、类型、客户id、租户id、状态,产品号 查询账户
     *
     * @param tenantId
     * @param customerId
     * @param loanId
     * @param typeList
     * @param statusList
     * @param productIds
     * @return
     */
    List<AmAccountMainInfo> selectAccountsByproductIds(@Param("tenantId") String tenantId,
                                                       @Param("customerId") String customerId,
                                                       @Param("loanId") String loanId,
                                                       @Param("typeList") List<String> typeList,
                                                       @Param(value = "statusList") List<String> statusList,
                                                       @Param(value = "productIds") List<String> productIds);

    /**
     * 批量更新账户信息（用于联机）
     *
     * @param accountMainInfos
     * @return
     */
    int batchUpdateAccount(List<AmAccountMainInfo> accountMainInfos);

    /**
     * 批量更新账户信息（用于批量）
     *
     * @param accountMainInfos
     * @return
     */
    int batchUpdateAccountForBatch(List<AmAccountMainInfo> accountMainInfos);

    /**
     * 根据客户id与租户id修改账户信息
     *
     * @param accountMainInfo 账户信息
     * @return
     */
    int updateByIdAndCustomerIdAndTenantId(AmAccountMainInfo accountMainInfo);

    List<AmAccountMainInfo> selectAccount(@Param("loanId") String loanId,
                                          @Param("customerId") String customerId,
                                          @Param("tenantId") String tenantId,
                                          @Param("typeList") List<String> typeList,
                                          @Param("billingTenor") Integer billingTenor,
                                          @Param("statusList") List<String> statusList);

    AmAccountMainInfo selectByAccountId(@Param("accountId") String accountId,@Param("tenantId") String tenantId,@Param("customerId") String customerId);
}
